package com.demo.designmode.proxy.dynamic.jdk1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @Author: jxm
 * @Description: 日志处理器类，实现了InvocationHandler接口，用于定义代理逻辑
 * @Date: 2024-1-11 11:27
 * @Version: 1.0
 */
public class LogHandler implements InvocationHandler {

    // 持有一个目标对象的引用
    private Object target;

    //构造方法，传入一个目标对象
    public LogHandler(Object target){
        this.target = target;
    }

    /**
     * 实现invoke方法，用于调用目标对象的方法，并在之前和之后执行日志操作
     * @param proxy 代理对象
     * @param method 对应于在代理对象上调用的接口方法的 Method 实例
     * @param args 代理对象调用接口方法时传递的实际参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 在调用目标对象之前，记录开始时间
        long startTime = System.currentTimeMillis();
        System.out.println("执行" + method.getName() + "方法..."+"之前");
        // 调用目标对象的方法，并获取返回值
        Object result = method.invoke(target, args);
        System.out.println("执行" + method.getName() + "方法..."+"之后");
        // 在调用目标对象之后，记录结束时间和耗时
        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;
        System.out.println("结束执行" + method.getName() + "方法，耗时" + duration + "毫秒");
        // 返回结果
        return result;
    }
}
